package ServidorDistribuido;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HiloServidorLectura implements Runnable{
    InetAddress ipCliente = null;
    Socket socketCliente = null;
    static boolean condicionParada;

    HiloServidorLectura(InetAddress ipCliente, Socket socketCliente) {
        this.ipCliente = ipCliente;
        this.socketCliente = socketCliente;
    }

    public void run() {
        System.out.println("Comenzo la ejecucion de HiloServidorLectura.");
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader
                        (socketCliente.getInputStream()));
            String leido = null;
            while(Servidor.servidorCreado && (leido = in.readLine()) != null){
                System.out.println("HSL: El servidor me envio por multicast: " + leido);
                String [] parseLeido = leido.split("[|]");
                String cabecera = parseLeido[0];
                if (cabecera.equals("relojLogico")){
                    //actualizo las estructuras del servidor dependiendo del caso
                    Servidor.relojLogico = Integer.parseInt(parseLeido[1]);
                    System.out.println("\nHSL: Recibido relojLogico. Valor Actual: " + Servidor.relojLogico);
                    
                } else if (cabecera.equals("cargaDeTrabajo")){
                    InetAddress ip = InetAddress.getByName(parseLeido[1]);
                    int cargaDeTrabajo = Integer.parseInt(parseLeido[2]);
                    Servidor.cargaDeTrabajo.put(ip, cargaDeTrabajo);
                    System.out.println("\nHSL: Recibido cargaDeTrabajo. Valor Actual: " + Servidor.cargaDeTrabajo);

                } else if (cabecera.equals("estadoEjecucion")){
                    InetAddress ip = InetAddress.getByName(parseLeido[1]);
                    boolean estado = Boolean.parseBoolean(parseLeido[2]);
                    Servidor.estadoEjecucion.put(ip, estado);
                    System.out.println("\nHSL: Recibido estadoEjecucion. Valor Actual: " + Servidor.estadoEjecucion);

                } else if (cabecera.equals("ipSocket")){
//                    InetAddress ipCliente2 = InetAddress.getByName(parseLeido[1]);
//                    Socket socketCliente2 = parseLeido[2];
//                    Servidor.ipSocket.put(ipCliente2, socketCliente2);
                      System.out.println("\nHSL: Recibido ipSocket. Valor Actual: ");

                } else if (cabecera.equals("archivosPorServidor")){
                    String archivo = parseLeido[1] + "|" + parseLeido[2];
                    InetAddress ip = InetAddress.getByName(parseLeido[3]);
                    if(Servidor.archivosPorServidor.contains(archivo)){
                        Servidor.archivosPorServidor.get(parseLeido[1]).add(ip);
//                        Servidor.archivosPorServidor.put(archivo, null);
                    }else{
                        ArrayList listaServ = new ArrayList <InetAddress>();
                        listaServ.add(ip);
                        Servidor.archivosPorServidor.put(archivo, listaServ);
                    }
                    System.out.println("\nHSL: Recibido archivosPorServidor. Valor Actual: " + Servidor.archivosPorServidor);

                } else if (cabecera.equals("versionArchivo")){
                    String archivo = parseLeido[1];
                    int version = Integer.parseInt(parseLeido[2]);
                    Servidor.versionArchivo.put(archivo, version);
                    System.out.println("\nHSL: Recibido versionArchivo. Valor Actual: " + Servidor.versionArchivo);

                } else if (cabecera.equals("esCoordinador")){
                    Servidor.esCoordinador = Boolean.parseBoolean(parseLeido[1]);
                    System.out.println("\nHSL: Recibido esCoordinador. Valor Actual: " + Servidor.esCoordinador);
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(HiloPorServidorLectura.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
